/*
 * Copyright 2002-2020 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.core;

/**
 * Common interface for managing aliases. Serves as a super-interface for
 * {@link org.springframework.beans.factory.support.BeanDefinitionRegistry}.
 *
 * @author Juergen Hoeller
 * @since 2.5.2
 */

/**
1 作用  专门用于管理别名（alias）功能。它的主要作用包括：
	 提供统一的别名注册和管理机制
	 允许为已注册的组件定义一个或多个别名
	 支持别名的增删查操作
 作为 BeanDefinitionRegistry 的父接口，为 Spring Bean 定义注册提供别名支持

2  方法
	 void registerAlias(String name, String alias)：为给定的规范名称注册一个别名
	 void removeAlias(String alias)：从注册表中移除指定的别例
	 boolean isAlias(String name)：判断给定名称是否被定义为别名（而不是实际注册组件的名称）
	 String[] getAliases(String name)：返回给定名称的别名列表（如果已定义）

3 相关的接口和类
	 AliasRegistry (当前接口)
	 ↑
	 BeanDefinitionRegistry (子接口)
	 ↑
	 DefaultListableBeanFactory (实现类)

 AliasRegistry 是 BeanDefinitionRegistry 的父接口，为 Spring Bean 定义注册提供别名支持
 BeanDefinitionRegistry 扩展了 AliasRegistry，在其基础上增加了 Bean 定义的注册功能
 DefaultListableBeanFactory 是主要的实现类，同时实现了 BeanDefinitionRegistry 接口，因此也间接实现了 AliasRegistry
 SimpleAliasRegistry 是一个AliasRegistry的简单实现类，用于管理别名

 4. 应用场景
	 Bean 别名管理：在 Spring 容器中，允许为同一个 Bean 定义多个名称，提高使用的灵活性
	 组件命名灵活性：当需要为已注册的组件提供更友好的名称或简化名称时使用
	 配置兼容性：在系统重构或版本升级时，保持向后兼容性，通过别名支持旧的配置引用
	 依赖注入优化：允许使用不同的名称引用同一个 Bean，提高配置的可读性和维护性

 */
public interface AliasRegistry {

	/**
	 * Given a name, register an alias for it.
	 * @param name the canonical name
	 * @param alias the alias to be registered
	 * @throws IllegalStateException if the alias is already in use
	 * and may not be overridden
	 */
	void registerAlias(String name, String alias);

	/**
	 * Remove the specified alias from this registry.
	 * @param alias the alias to remove
	 * @throws IllegalStateException if no such alias was found
	 */
	void removeAlias(String alias);

	/**
	 * Determine whether the given name is defined as an alias
	 * (as opposed to the name of an actually registered component).
	 * @param name the name to check
	 * @return whether the given name is an alias
	 */
	boolean isAlias(String name);

	/**
	 * Return the aliases for the given name, if defined.
	 * @param name the name to check for aliases
	 * @return the aliases, or an empty array if none
	 */
	String[] getAliases(String name);

}
